package futbol.tacticas.concursantes.Equipo2008;

import futbol.tacticas.concursantes.Tactica;
import java.awt.Color;
import java.awt.Point;
import java.util.Vector;

import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;

public class Equipo2008 implements Tactica{

	private int nValores[][]={
	       			
			 {-160,0,7},  // Jugador 1[0] 
		     {-110,-60,6},  // Jugador 2[1] 
		     {-110,0,6},  // Jugador 3[2] 
		     {-110,60,6},  // Jugador 4[3] 
		     {-65,-80,7},  // Jugador 5[4]
		     {-65,80,6},  // Jugador 6[5]
		     {-35,5,6},  // Jugador 7[6]
		     {0,55,5},  // Jugador 8[7]
		     {50,0,5},  // Jugador 9[8]
		     {85,-35,6},  // Jugador 10[9]
		     {130,30,6}   // Jugador 11[10] 
	    };
	    
	    public Color getColor1() {
	        return Color.orange;
	    }

	    public Color getColor2() {
	        return Color.orange;
	    }

	    public Color getColorNumero() {
	        return Color.white;
	    }

	    public String getNombre() {
	        return "Brutamontes";
	    }

	    public int getXInicial(int n) {
	        return nValores[n][0];
	    }

	    public int getYInicial(int n) {
	        return nValores[n][1];
	    }

	    public int getFuerza(int n) {
	        return nValores[n][2];
	    }

	    public Vector<Comando> getComandos(SituacionJugadores sj) {
	        Vector<Comando> com = new Vector();
	        
	        com.clear();
	        
	        //Posicionamiento
	        for (int n=0;n<11;n++)
	            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));

	        Point bola=sj.getBola();
	        Point jugadores[]= sj.getMisJugadores();
	        Point contrarios[]= sj.getContrario();	        
	       
	        //Modifico la fuerza de los jugadores para que corran más o menos dependiendo de la
	        //distancia a la bola
	        //if(sj.getMasCercanoDeBola() != 0 ){
	        	int[] masCercano = sj.getInfoMasCercano(sj.getMisJugadores(), new Point(sj.getBola().x + 25, sj.getBola().y), null, false);
				
				int dist = masCercano[1];
				int frz = 5;
				
				if(sj.estoyMasCercaDeBola()){
					if(dist > 10){
						frz = 1;
						nValores[masCercano[0]][2] = frz;
						com.add(new ComandoIrA(masCercano[0], sj.getBola().x,  sj.getBola().y));
					}else{
						if(sj.getMisJugadores()[masCercano[0]].x > 85){
							frz = 10;
							nValores[masCercano[0]][2] = frz;
							com.add(new ComandoGolpearBola(10, 163, 0));
						}						
					}				
				}
	       //}else{
	        	if(General.getDistancia(sj.getMisJugadores()[0].x, sj.getMisJugadores()[0].y, sj.getBola().x, sj.getBola().y) > 15){
	        		nValores[0][2] = 1;
	        	}else{
	        		nValores[0][2] = 10;
	        	}
	       // }
	        	
			
			//************************************************
	        
	        //Táctica de juego para la defensa
	        
	        for(int i = 0; i < contrarios.length; i++){	        	
	        		 
	        			 for(int j = 1; j<5;j++){
		 	        			int aux[] = sj.getInfoMasCercano(contrarios, jugadores[j], null, false);
		 	        			
		 	        			//Los defensas cubren a los jugadores contrarios más cercanos a su posición
		 	        			com.add(new ComandoIrA(j, (int)contrarios[aux[0]].getX() + 5,  (int)contrarios[aux[0]].getY()));
		 	        			
		 	        			if(sj.estoyMasCercaDeBola()){
		 	        				int pase = sj.getSiguienteJugador(sj.getMasCercanoDeBola());
		 	        				
		 	        				//si es el portero se la paso a otro jugador
		 	        				if(pase == 0){
		 	        					pase = sj.getSiguienteJugador(pase);
		 	        				}
		 	        				//El siguiente del 10 es el -1, y eso no es válido		 	        				
		 	        				if(pase == -1)
		 	        					com.add(new ComandoGolpearBola(10,163,0));
		 	        					
		 	        					
		 	        					com.add(new ComandoPase(j, pase));
		 	        			}
	        			 }
	        }
		 	        				        	
	        if (bola.getX() <= -145 && sj.getMasCercanoDeBola() == 1) //es el portero
        	{
	        	//el portero va hacia la bola
	        	com.add(new ComandoIrA(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()),sj.getBola().getX(), sj.getBola().getY()));
        			
	        	//despeja la bola
	        	com.add(new ComandoTiroAPuerta(0,3));
        	}
	        
	        //Repliego al portero y la defensa en caso de que se adelanten demasiado
	        if( jugadores[0].getX() > getXInicial(0) 
	         ||	jugadores[2].getX() > getXInicial(2) + 50
	         || jugadores[3].getX() > getXInicial(3) + 50
	         || jugadores[4].getX() > getXInicial(4) + 50)
	        {
	        	for(int i=0; i<4; i++)
	        	{		        						        	
	        		com.add(new ComandoIrA(i, getXInicial(i), getYInicial(i)));
				}
	        }      
	        
	        //Los delanteros no pueden bajar del medio campo
	        if( jugadores[8].getX() < 0
	   	     || jugadores[9].getX() < getXInicial(9) - 30
	   	     || jugadores[10].getX() < getXInicial(10) - 20)
	   	        {
	   	        	for(int i=8; i<=10; i++)
	   	        	{		        						        	
	   	        		com.add(new ComandoIrA(i, getXInicial(i), getYInicial(i)));
	   				}
	   	        }
	        
	        //si la bola está por el centro del campo, los jugadores la juegan hasta
	        //que se pueda hacer un pase en condiciones
	        if(bola.getX() >= -65 && bola.getX()<65 )
	        {
	        	if(sj.getMasCercanoDeBola() == 7
		   		|| sj.getMasCercanoDeBola() == 8)
	        	{
	        		if (libreDeMarca(sj,sj.getMasCercanoDeBola()) == 9)
	        		{
	        			com.add(new ComandoPase(sj.getMasCercanoDeBola(),9));
	        		}
	        		if (libreDeMarca(sj,sj.getMasCercanoDeBola()) == 10)
	        		{
	        			com.add(new ComandoPase(sj.getMasCercanoDeBola(),10));
	        		}
	        		
	        		
	        		
	        		//Si ninguno de los delanteros está desmarcado, se adelanta el siguiente jugador y se
	        		//le pasa el balón
	        		com.add(new ComandoIrA(sj.getMasCercanoDeBola() + 1,getXInicial(sj.getMasCercanoDeBola() + 1) + 40,getYInicial(sj.getMasCercanoDeBola() + 1) + 40));
	        		
	        		//se le pasa el balón al jugador desmarcado
	        		com.add(new ComandoPase(sj.getMasCercanoDeBola(),sj.getMasCercanoDeBola() + 1));   		
	        	}
	        }
	        
	        if(sj.getMasCercanoDeBola() == 5)
	        {
	        	//Si ninguno de los delanteros está desmarcado, se adelanta el siguiente jugador y se
        		//le pasa el balón
        		com.add(new ComandoIrA(10,getXInicial(10) + 25,getYInicial(10) - 50));
        		
        		//se le pasa el balón al jugador desmarcado
        		com.add(new ComandoPase(5,10));
	        }
	   	    
	        if(sj.getMasCercanoDeBola() == 6)
	        {
	        	//Si ninguno de los delanteros está desmarcado, se adelanta el siguiente jugador y se
        		//le pasa el balón
        		com.add(new ComandoIrA(8,getXInicial(8) + 25,getYInicial(8) + 50));
        		
        		//se le pasa el balón al jugador desmarcado
        		com.add(new ComandoGolpearBola(6,jugadores[8].getX(),jugadores[8].getY()));
	        }
	        /******************************************/
	        if( sj.getMasCercanoDeBola() == 8 )// == 7 && bola.getX() > 50)
	   	   	{
	        	if( (libreDeMarca(sj, 8)) == 9 || (libreDeMarca(sj, 8)) == 10)
	        	{
	        		com.add(new ComandoIrA(9, getXInicial(9) + 5, getYInicial(9) - 8));
	  	        	com.add(new ComandoIrA(10, getXInicial(10) + 10, getYInicial(10) + 5));
	  	        	
	  	        	if( (libreDeMarca(sj, 8)) == 9)
		        	{
		        		com.add(new ComandoPase (8,9));
		        		com.add(new ComandoIrA(9,bola.getX(),bola.getY()));
		        	}
		        	else if( (libreDeMarca(sj, 8)) == 10)
		        	{
		        		com.add(new ComandoPase (8,10));
		        		com.add(new ComandoIrA(10,bola.getX(),bola.getY()));
		        	}
	        	}
	          	else
	        	{
	        		com.add(new ComandoPase (8,libreDeMarca(sj, 8)));
	        	}
	   	   		
	   	   	}
	        else
	        {
	        	com.add(new ComandoPase (8,sj.getSiguienteJugador(8)));
	        }
	   	        
	        if( sj.estoyMasCercaDeBola() && bola.getX() > 110 && 
		  	         ( sj.getMasCercanoDeBola() == 9 
		  	   		|| sj.getMasCercanoDeBola() == 10 ))//es alguno de los delanteros
		  	        {	        		
	        			//mi jugador más cercano a la bola va hacia ella
	        			com.add(new ComandoIrA(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()), sj.getBola().getX(), sj.getBola().getY()));
	        			com.add(new ComandoGolpearBola(10, 163, 0));        			
		  	        }
	        
	        if(sj.estoyMasCercaDeBola() && bola.getX() < 125 &&
	          (sj.getMasCercanoDeBola() == 5 
	        || sj.getMasCercanoDeBola() == 6 
	        || sj.getMasCercanoDeBola() == 7
	        || sj.getMasCercanoDeBola() == 8))
	        //|| sj.getMasCercanoDeBola() == 9
	        //|| sj.getMasCercanoDeBola() == 10))
	        {
	        	com.add(new ComandoIrA(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()), sj.getBola().getX(), sj.getBola().getY()));
	        	com.add(new ComandoPase(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()) , libreDeMarca(sj,sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()))));
	        	
	        	if(bola.getX() > 105)
	        	{
	        		if(sj.getContrario()[0].y > 0)
	        			com.add(new ComandoTiroAPuerta(sj.getMasCercanoDeBola(),-30));
	        		else
	        			com.add(new ComandoTiroAPuerta(sj.getMasCercanoDeBola(),30));
	        		
	        	}
	        }
	        	

	        //Movimiento portero
	        int y=(int)(bola.getY()/2);
	        if (y<-20) y=-30;
	        if (y>20) y=30;
	        com.add(new ComandoIrA(0,nValores[0][0], y));
	        
	        //Movimiento mas cercano a la bola
	        int nJug=sj.getMasCercanoDeBola();
	        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));

	        com.add(new ComandoGolpearBola(nJug, 163, 0));
	        
	        return com;
	    }	
	    
	    //private desmarcar(SituacionJugadores sj,)   
	    
	    //Devuelve el jugador desmarcado más cercano al que se la pasa como parámetro 
	    private int libreDeMarca(SituacionJugadores sj,int j)
	    {
	    	//Point bola=sj.getBola();
	        Point jugadores[]=sj.getMisJugadores();
	        //Point contrarios[]=sj.getContrario();
	        int distancia = 0;
	        int a = 0;
	        
	        if(j >= 4)
	        {
	        	for(int i = j; i<11; i++)
		    	{
		    		distancia = (int)General.getDistancia(jugadores[i].getX(),jugadores[i].getY(), sj.getContrario()[sj.getContrarioMasCerca(jugadores[i].getX(), jugadores[i].getY())].x, sj.getContrario()[sj.getContrarioMasCerca(jugadores[i].getX(), jugadores[i].getY())].y); 
		    		if(distancia > 10 )
		    		{
		    			//if(i == 8  || i == 9 || i == 10)
		    			//	{
		    					//me quedo con los jugadores que están por delante del j
		    					if (i > j)
		    					{
		    						a = i;
		    					}
		    					else
		    					{
		    						a = sj.getSiguienteJugador(i);
		    					}
		    					
		    				//}
		    		}    			
		    	}
	        }
	        else
	        {
	        	a = sj.getSiguienteJugador(j);
	        }
	        
	        if(a == -1)
	        	a = 10;
	    	
	    	return a;
	    }	    
	}
